Go 操作 Redis 之 redigo 库
redigo 项目地址
因为这个工具主要是发送命令的形式操作 Redis,所以可以参考下 Redis 的命令
读写数据
import (
"fmt"
"github.com/gomodule/redigo/redis"
"time"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
// n, err := conn.Do("APPEND", "key", "value")
// 这里后面携带的 EX 参数设置超时,等价于 SET name lisa EX 5 命令
_, err = c.Do("SET", "name", "lisa", "EX", "15")
if err != nil {
fmt.Println("redis set failed:", err)
}
username, err := redis.String(c.Do("GET", "name"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get mykey: %v \n", username)
}
time.Sleep(18 * time.Second)
username, err = redis.String(c.Do("GET", "name"))
if err != nil {
fmt.Println("redis get failed:", err)
} else {
fmt.Printf("Get name: %v \n", username)
}
}
可以看到已经把数据插进来了(超时前看)
输出
Get mykey: lisa
redis get failed: redigo: nil returned
这里读取数据的类型转换可以使用自带的包
批量写入与读取
_, err = c.Do("LPUSH","number","one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten")
或者批量插入 Key Value
import (
"fmt"
"github.com/gomodule/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
//arr := []string{"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"}
// MSET key1 "Hello" key2 "World"
_, err = c.Do("MSET",
"name", "lisa",
"sex", "female")
isKeyExit, err := redis.Bool(c.Do("EXISTS", "name"))
if err != nil {
fmt.Println("error:", err)
} else {
fmt.Printf("Is name key exists ? : %v \n", isKeyExit)
}
reply, err := redis.Values(c.Do("MGET", "name", "sex"))
if err != nil {
fmt.Printf("patch get name & sex error \n。")
} else {
var name string
var sex string
// 使用 Scan 绑定数据
_, err := redis.Scan(reply, &name, &sex)
if err != nil {
fmt.Printf("Scan error \n。")
} else {
fmt.Printf("The name is %v, sex is %v \n", name, sex)
}
}
}
读写 JSON
反序列化和序列化
import (
"encoding/json"
"fmt"
"github.com/gomodule/redigo/redis"
)
func main() {
c, err := redis.Dial("tcp", "127.0.0.1:6379")
if err != nil {
fmt.Println("Connect to redis error", err)
return
}
defer c.Close()
key := "profile"
// 序列化
imap := map[string]string{"name": "lisa", "sex": "male", "mobile": "1234567"}
value, _ := json.Marshal(imap) // 序列化
// SETNX = SET if Not Exists => https://redis.io/commands/setnx
n, err := c.Do("SETNX", key, value)
if err != nil {
fmt.Println(err)
}
if n == int64(1) {
fmt.Println("set Json key success")
}
// 反序列化
var imapGet map[string]string
valueGet, err := redis.Bytes(c.Do("GET", key))
if err != nil {
fmt.Println(err)
}
err1 := json.Unmarshal(valueGet, &imapGet)
if err1 != nil {
fmt.Println(err1)
}
fmt.Println(imapGet["name"])
fmt.Println(imapGet["sex"])
fmt.Println(imapGet["mobile"])
}
输出:
set Json key success
lisa
male
1234567